import cn.hutool.poi.excel.ExcelUtil
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.*
import site.addzero.common.kt_util.isNotNull
import site.addzero.util.str.containsAnyIgnoreCase
import java.io.FileOutputStream
import java.io.File

/**
 * Excel读取工具类
 */
class ExcelReader {

    /**
     * 从Excel文件中读取指定sheet的h开头值
     *
     * @param filePath Excel文件路径
     * @param sheetNames 要读取的sheet名称列表
     * @return 包含所有h开头单元格值的Set
     */
    fun readHValuesFromSheets(filePath: String, sheetNames: List<String>): Set<String> {
        val hValues = mutableSetOf<String>()
        val flatMap = sheetNames.flatMap {
            val rows = ExcelUtil.getReader(filePath, it).read()
            rows

        }
        val flatMap1 = flatMap.flatMap{
            it.toList<Any>()
                .filter { it.isNotNull() }
            .map { it.toString() }.filter<String> {
             val startsWith = it.startsWith("h")
                    val containsAnyIgnoreCase = it.containsAnyIgnoreCase("h")
                    startsWith||containsAnyIgnoreCase
                }.map {
                   it.lowercase()
                }.map { it.trim() }
        }

        return flatMap1.toSet()
    }

    /**
     * 生成从h1到hN的完整集合
     *
     * @param maxIndex 最大索引值
     * @return 完整的h值集合
     */
    fun generateExpectedHValues(maxIndex: Int): Set<String> {
        return (1..maxIndex).map { "h$it" }.toSet()
    }

    /**
     * 找出缺失的h值
     *
     * @param filePath Excel文件路径
     * @param maxIndex 最大索引值
     * @return 缺失的h值集合
     */
    fun findMissingHValues(filePath: String, maxIndex: Int): Set<String> {
        val sheetNames = (1..58).map { it.toString() }
        val expected = generateExpectedHValues(maxIndex)
        val actual = readHValuesFromSheets(filePath, sheetNames)

        return expected - actual
    }

    /**
     * 将缺失的h值导出到文本文件
     *
     * @param missingHValues 缺失的h值集合
     * @param outputPath 输出文件路径
     */
    fun exportMissingHValuesToText(missingHValues: Set<String>, outputPath: String) {
        File(outputPath).printWriter().use { writer ->
            missingHValues.sorted().forEach { hValue ->
                writer.println(hValue)
            }
        }
    }
}
